home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2gem106.lzh / CRYSTAL1.06 / SRC / CRYSTAL / VCONTROL.MOD < prev    next >
Encoding:
Modula Implementation  |  1993-11-07  |  19.0 KB  |  956 lines

  1. IMPLEMENTATION MODULE VControl;
  2.  
  3. (*
  4. VDI Control Functions.
  5.  
  6. UK __DATE__ __TIME__
  7. *)
  8.  
  9. (*IMP_SWITCHES*)
  10.  
  11. #if ST
  12. FROM AES      IMPORT Version;
  13. (*FROM GrafMgr  IMPORT GrafHandle;*)
  14. #endif
  15. FROM VDI      IMPORT contrl,intin,ptsin,intout,ptsout,v,vdi,CallVDI,XY,
  16.                      Integer,EOS,IntegerOutputRange,IntegerInputRange,
  17.                      MaxInput,CallVDIEsc,MFDB;
  18. FROM PORTAB   IMPORT UNSIGNEDLONG,UNSIGNEDWORD,SIGNEDWORD,ANYBYTE,ANYPOINTER,
  19.                      NULL;
  20. #ifdef FTLM2
  21.  
  22. #else
  23. FROM SYSTEM   IMPORT ADR;
  24. #endif
  25. #if (defined LPRM2) || (defined SPCM2)
  26. FROM SYSTEM   IMPORT REG,INLINE,VAL,SHORT;
  27. FROM Register IMPORT D0;
  28. #elif (defined HM2)
  29. FROM SYSTEM   IMPORT CAST,STORE,CODE;
  30. FROM Register IMPORT D0;
  31. #elif (defined TDIM2)
  32. FROM SYSTEM   IMPORT REGISTER,CODE;
  33. FROM Register IMPORT D0;
  34. #elif (defined ANAM2)
  35. FROM SYSTEM   IMPORT REGISTER,CODE;
  36. FROM Register IMPORT D0;
  37. #elif (defined MM2)
  38. FROM SYSTEM   IMPORT ASSEMBLER,CAST;
  39. #elif (defined FTLM2)
  40. FROM SYSTEM   IMPORT ADR,GETREG,CODE;
  41. FROM Register IMPORT D0;
  42. #else
  43. CAST_IMPORT
  44. #endif
  45.  
  46. #if ST
  47. #warning ...using GetCookie(),
  48. #warning you need M2POSIX 0.7 or higher
  49. FROM DosSystem IMPORT GetCookie;
  50.  
  51. VAR OffScreen: UNSIGNEDWORD; (* for NVDI 2.5 or higher *)
  52. #endif
  53.  
  54. #if (defined LPRM2) || (defined SPCM2)
  55. PROCEDURE NOTVQGDOS(): BOOLEAN;
  56.  
  57.   PROCEDURE Trap2;
  58.     CODE(04E42H);
  59.  
  60. BEGIN
  61.   IF Version() = 0220H THEN
  62.     RETURN FALSE; (* NOT TRUE *)
  63.   ELSE
  64.     INLINE(070FEH); (* moveq  #-2,d0 *)
  65.     Trap2;          (* trap   #2     *)
  66.     INLINE(05440H); (* addq.w #$2,d0 *)
  67.     RETURN CHR(SHORT(REG(D0))) = 0C;
  68.   END;
  69. END NOTVQGDOS;
  70.  
  71. PROCEDURE VQFSMGDOS(): BOOLEAN;
  72.  
  73.   PROCEDURE Trap2;
  74.     CODE(04E42H);
  75.  
  76. BEGIN
  77.   IF Version() = 0220H THEN
  78.     RETURN FALSE; (* NOT TRUE *)
  79.   ELSE
  80.     INLINE(070FEH); (* moveq #-2,d0 *)
  81.     Trap2;          (* trap  #2     *)
  82.     RETURN REG(D0) = 05F46534DH;
  83.   END;
  84. END VQFSMGDOS;
  85.  
  86. PROCEDURE VQFNTGDOS(): BOOLEAN;
  87.  
  88.   PROCEDURE Trap2;
  89.     CODE(04E42H);
  90.  
  91. BEGIN
  92.   IF Version() = 0220H THEN
  93.     RETURN FALSE; (* NOT TRUE *)
  94.   ELSE
  95.     INLINE(070FEH); (* moveq #-2,d0 *)
  96.     Trap2;          (* trap  #2     *)
  97.     RETURN REG(D0) = 05F464E54H;
  98.   END;
  99. END VQFNTGDOS;
  100. #endif
  101.  
  102. #ifdef HM2
  103. PROCEDURE NOTVQGDOS(): BOOLEAN;
  104.  
  105. CONST trap2 = 4E42H;
  106.  
  107. VAR Ret: UNSIGNEDLONG;
  108.  
  109. BEGIN
  110.   IF Version() = 0220H THEN
  111.     RETURN FALSE; (* NOT TRUE *)
  112.   ELSE
  113.     CODE(070FEH); (* moveq  #-2,d0 *)
  114.     CODE(trap2);  (* trap   #2     *)
  115.     CODE(05440H); (* addq.w #$2,d0 *)
  116.     STORE(D0,Ret);
  117.     RETURN CHR(Ret) = 0C;
  118.   END;
  119. END NOTVQGDOS;
  120.  
  121. PROCEDURE VQFSMGDOS(): BOOLEAN;
  122.  
  123. CONST trap2 = 4E42H;
  124.  
  125. VAR Ret: UNSIGNEDLONG;
  126.  
  127. BEGIN
  128.   IF Version() = 0220H THEN
  129.     RETURN FALSE; (* NOT TRUE *)
  130.   ELSE
  131.     CODE(070FEH); (* moveq  #-2,d0 *)
  132.     CODE(trap2);  (* trap   #2     *)
  133.     STORE(D0,Ret);
  134.     RETURN Ret = 05F46534DH;
  135.   END;
  136. END VQFSMGDOS;
  137.  
  138. PROCEDURE VQFNTGDOS(): BOOLEAN;
  139.  
  140. CONST trap2 = 4E42H;
  141.  
  142. VAR Ret: UNSIGNEDLONG;
  143.  
  144. BEGIN
  145.   IF Version() = 0220H THEN
  146.     RETURN FALSE; (* NOT TRUE *)
  147.   ELSE
  148.     CODE(070FEH); (* moveq  #-2,d0 *)
  149.     CODE(trap2);  (* trap   #2     *)
  150.     STORE(D0,Ret);
  151.     RETURN Ret = 05F464E54H;
  152.   END;
  153. END VQFNTGDOS;
  154. #endif
  155.  
  156. #ifdef TDIM2
  157. PROCEDURE NOTVQGDOS(): BOOLEAN;
  158.  
  159. CONST trap2 = 4E42H;
  160.  
  161. BEGIN
  162.   IF Version() = 0220H THEN
  163.     RETURN FALSE; (* NOT TRUE *)
  164.   ELSE
  165.     CODE(303CH,-2);  (* move.w #-2,d0 *)
  166.     CODE(trap2);     (* trap   #2     *)
  167.     CODE(0B07CH,-2); (* cmp.w  #-2,d0 *)
  168.     CODE(57C0H);     (* seq    d0     *)
  169.     RETURN BOOLEAN(CHR(SHORT(LONGCARD(REGISTER(D0)))));
  170.   END;
  171. END NOTVQGDOS;
  172.  
  173. PROCEDURE VQFSMGDOS(): BOOLEAN;
  174.  
  175. CONST trap2 = 4E42H;
  176.  
  177. BEGIN
  178.   IF Version() = 0220H THEN
  179.     RETURN FALSE; (* NOT TRUE *)
  180.   ELSE
  181.     CODE(303CH,-2);  (* move.w #-2,d0 *)
  182.     CODE(trap2);     (* trap   #2     *)
  183.     RETURN REGISTER(D0) = 05F46534DH;
  184.   END;
  185. END VQFSMGDOS;
  186.  
  187. PROCEDURE VQFNTGDOS(): BOOLEAN;
  188.  
  189. CONST trap2 = 4E42H;
  190.  
  191. BEGIN
  192.   IF Version() = 0220H THEN
  193.     RETURN FALSE; (* NOT TRUE *)
  194.   ELSE
  195.     CODE(303CH,-2);  (* move.w #-2,d0 *)
  196.     CODE(trap2);     (* trap   #2     *)
  197.     RETURN REGISTER(D0) = 05F464E54H;
  198.   END;
  199. END VQFNTGDOS;
  200. #endif
  201.  
  202. #ifdef FTLM2
  203. PROCEDURE NOTVQGDOS(): BOOLEAN;
  204.  
  205. CONST trap2 = 4E42H;
  206.  
  207. VAR Ret: UNSIGNEDLONG;
  208.  
  209. BEGIN
  210.   IF Version() = 0220H THEN
  211.     RETURN FALSE; (* NOT TRUE *)
  212.   ELSE
  213.     CODE(070FEH); (* moveq  #-2,d0 *)
  214.     CODE(trap2);  (* trap   #2     *)
  215.     CODE(05440H); (* addq.w #$2,d0 *)
  216.     GETREG(D0,Ret);
  217.     RETURN CHR(CARDINAL(Ret)) = 0C;
  218.   END;
  219. END NOTVQGDOS;
  220.  
  221. PROCEDURE VQFSMGDOS(): BOOLEAN;
  222.  
  223. CONST trap2 = 4E42H;
  224.  
  225. VAR Ret: UNSIGNEDLONG;
  226.  
  227. BEGIN
  228.   IF Version() = 0220H THEN
  229.     RETURN FALSE; (* NOT TRUE *)
  230.   ELSE
  231.     CODE(070FEH); (* moveq  #-2,d0 *)
  232.     CODE(trap2);  (* trap   #2     *)
  233.     GETREG(D0,Ret);
  234.     RETURN Ret = 05F46534DH;
  235.   END;
  236. END VQFSMGDOS;
  237.  
  238. PROCEDURE VQFNTGDOS(): BOOLEAN;
  239.  
  240. CONST trap2 = 4E42H;
  241.  
  242. VAR Ret: UNSIGNEDLONG;
  243.  
  244. BEGIN
  245.   IF Version() = 0220H THEN
  246.     RETURN FALSE; (* NOT TRUE *)
  247.   ELSE
  248.     CODE(070FEH); (* moveq  #-2,d0 *)
  249.     CODE(trap2);  (* trap   #2     *)
  250.     GETREG(D0,Ret);
  251.     RETURN Ret = 05F464E54H;
  252.   END;
  253. END VQFNTGDOS;
  254. #endif
  255.  
  256. #ifdef ANAM2
  257. PROCEDURE NOTVQGDOS(): BOOLEAN;
  258.  
  259. CONST trap2 = 4E42H;
  260.  
  261. BEGIN
  262.   IF Version() = 0220H THEN
  263.     RETURN FALSE; (* NOT TRUE *)
  264.   ELSE
  265.     CODE(070FEH); (* moveq  #-2,d0 *)
  266.     CODE(trap2);  (* trap   #2     *)
  267.     CODE(05440H); (* addq.w #$2,d0 *)
  268.     RETURN CHR(REGISTER(D0)) = 0C;
  269.   END;
  270. END NOTVQGDOS;
  271.  
  272. PROCEDURE VQFSMGDOS(): BOOLEAN;
  273.  
  274. CONST trap2 = 4E42H;
  275.  
  276. BEGIN
  277.   IF Version() = 0220H THEN
  278.     RETURN FALSE; (* NOT TRUE *)
  279.   ELSE
  280.     CODE(070FEH); (* moveq #-2,d0 *)
  281.     CODE(trap2);  (* trap  #2     *)
  282.     RETURN REGISTER(D0) = 05F46534DH;
  283.   END;
  284. END NOTVQFSMGDOS;
  285.  
  286. PROCEDURE VQFNTGDOS(): BOOLEAN;
  287.  
  288. CONST trap2 = 4E42H;
  289.  
  290. BEGIN
  291.   IF Version() = 0220H THEN
  292.     RETURN FALSE; (* NOT TRUE *)
  293.   ELSE
  294.     CODE(070FEH); (* move.w #-2,d0 *)
  295.     CODE(trap2);  (* trap   #2     *)
  296.     RETURN REGISTER(D0) = 05F464E54H;
  297.   END;
  298. END NOTVQFNTGDOS;
  299. #endif
  300.  
  301. #ifdef MM2
  302. PROCEDURE NOTVQGDOS(): BOOLEAN;
  303.  
  304. VAR X: LONGINT;
  305.  
  306. BEGIN
  307.   IF Version() = 0220H THEN
  308.     RETURN FALSE; (* NOT TRUE *)
  309.   ELSE
  310.     ASSEMBLER
  311.       MOVEQ  #-2,D0;
  312.       TRAP   #2;
  313.       MOVE.L D0,X(A6);
  314.     END;
  315.     RETURN X = -2L;
  316.   END;
  317. END NOTVQGDOS;
  318.  
  319. PROCEDURE VQFSMGDOS(): BOOLEAN;
  320.  
  321. VAR X: LONGINT;
  322.  
  323. BEGIN
  324.   IF Version() = 0220H THEN
  325.     RETURN FALSE; (* NOT TRUE *)
  326.   ELSE
  327.     ASSEMBLER
  328.       MOVEQ  #-2,D0;
  329.       TRAP   #2;
  330.       MOVE.L D0,X(A6);
  331.     END;
  332.     RETURN X = 5F46534DH;
  333.   END;
  334. END VQFSMGDOS;
  335.  
  336. PROCEDURE VQFNTGDOS(): BOOLEAN;
  337.  
  338. VAR X: LONGINT;
  339.  
  340. BEGIN
  341.   IF Version() = 0220H THEN
  342.     RETURN FALSE; (* NOT TRUE *)
  343.   ELSE
  344.     ASSEMBLER
  345.       MOVEQ  #-2,D0;
  346.       TRAP   #2;
  347.       MOVE.L D0,X(A6);
  348.     END;
  349.     RETURN X = 5F464E54H;
  350.   END;
  351. END VQFNTGDOS;
  352. #endif
  353.  
  354. #if ST
  355. PROCEDURE VQSpeedoGDOS(): BOOLEAN;
  356.  
  357. CONST FSMC   = 046534D43H;
  358.       Speedo = 05F535044H;
  359.  
  360. #ifdef TDIM2
  361. TYPE ULPTR = RECORD
  362.                CASE: BOOLEAN OF
  363.                  TRUE:
  364.                    PTR: POINTER TO UNSIGNEDLONG;
  365.                | FALSE:
  366.                    UL: UNSIGNEDLONG;
  367.                END;
  368.              END;
  369.  
  370. VAR Value: ULPTR;
  371. #else
  372. VAR Value: POINTER TO UNSIGNEDLONG;
  373. #endif
  374.  
  375. BEGIN
  376. #ifdef TDIM2
  377.   IF GetCookie(FSMC,Value.UL) THEN
  378.     IF Value.PTR^ = Speedo THEN
  379. #else
  380.   IF GetCookie(FSMC,CAST(UNSIGNEDLONG,Value)) THEN
  381.     IF Value^ = Speedo THEN
  382. #endif
  383.       RETURN TRUE;
  384.     END;
  385.   END;
  386.   RETURN FALSE;
  387. END VQSpeedoGDOS;
  388. #endif
  389.  
  390. PROCEDURE VGetDriverInfo(    Device    : UNSIGNEDWORD;
  391.                              Info      : InfoSelections;
  392.                          VAR InfoString: ARRAY OF CHAR;
  393.                          VAR InfoWord  : UNSIGNEDWORD);
  394.  
  395. VAR i: IntegerOutputRange;
  396.  
  397. BEGIN
  398. #if ST
  399.   IF NOTVQGDOS() THEN
  400.     intout[0]:= 0; (* error *)
  401.     RETURN;
  402.   END;
  403. #endif
  404.   WITH contrl DO
  405.     c[0]:= CAST(UNSIGNEDWORD,-1);
  406.     c[1]:= 0;
  407.     c[3]:= 2;
  408.     c[5]:= 4;
  409.     c[6]:= 0;
  410.   END;
  411.   intin[0]:= Device;
  412.   intin[1]:= ORD(Info);
  413.   vdi;
  414.   IF Info # DrvPatch THEN
  415.     i:= 0;
  416.     WHILE i < contrl.c[4] DO
  417.       InfoString[i]:= CHR(CAST(UNSIGNEDWORD,intout[i]));
  418.       INC(i);
  419.     END;
  420.     InfoString[i]:= EOS;
  421.   ELSE
  422.     InfoWord:= intout[0];
  423.   END;
  424. END VGetDriverInfo;
  425.  
  426. PROCEDURE VOpnWk(VAR WorkIn : ARRAY OF UNSIGNEDWORD;
  427.                      MaxX   : XY;
  428.                      MaxY   : XY;
  429.                  VAR Handle : UNSIGNEDWORD;
  430.                  VAR WorkOut: ARRAY OF UNSIGNEDWORD;
  431.                  VAR Buffer : MFDB);
  432.  
  433. #if ST
  434. CONST OffScreenWork = 90;
  435.       EdDI = 045644449H;
  436. #endif
  437.  
  438. VAR i: [0..(MaxWorkIn - 1)];
  439.     P: POINTER TO ANYPOINTER;
  440.     D: UNSIGNEDWORD;
  441. #if ST
  442.     Value: UNSIGNEDLONG;
  443. #endif
  444.  
  445. BEGIN
  446. #if ST
  447.   IF NOTVQGDOS() THEN
  448.     intout[0]:= 0; (* error *)
  449.     Handle:= 0; (* error *)
  450.     RETURN;
  451.   END;
  452. #endif
  453.  
  454. #if ST
  455.   IF WorkIn[0] = OffScreenWork THEN
  456.     IF NOT GetCookie(EdDI,Value) THEN
  457.       intout[0]:= 0; (* error *)
  458.       Handle:= 0; (* error *)
  459.       RETURN;
  460.     ELSE
  461.       WorkIn[11]:= MaxX;
  462.       WorkIn[12]:= MaxY;
  463.  
  464.       WorkIn[13]:= 0;
  465.       WorkIn[14]:= 0;
  466.  
  467.       FOR i:= 15 TO 19 DO
  468.         WorkIn[i]:= 0;
  469.       END;
  470.     END;
  471.   END;
  472. #endif
  473.  
  474. #if long
  475.   FOR i:= 0 TO VAL(IntegerInputRange,HIGH(WorkIn)) DO
  476.     intin[i]:= WorkIn[i];
  477.   END;
  478. #else
  479.   WITH v DO
  480.     iioff:= ADR(WorkIn);
  481.     iooff:= ADR(WorkOut);
  482.     pooff:= ADR(WorkOut[45]);
  483. #endif
  484.  
  485.     WITH contrl DO
  486.       CASE WorkIn[0] OF Printer..(Metafile - 1),Memory..(Image - 1):
  487.         IF MaxX # 0 THEN
  488.           ptsin[0]:= MaxX + 1;
  489.           ptsin[1]:= MaxY + 1;
  490.           c[1]:= 1; (* #ptsin[]/2 *)
  491.         ELSE
  492.           c[1]:= 0; (* #ptsin[]/2 *)
  493.         END;
  494.       ELSE
  495.         c[1]:= 0; (* #ptsin[]/2 *)
  496.       END;
  497.  
  498.       c[0]:= 1; (* OpCode *)
  499.     (*c[1] see above *)
  500.       c[2]:= 6;
  501.       c[3]:= HIGH(WorkIn) + 1; (* #intin[] *)
  502.       c[4]:= 45;
  503.     END;
  504.  
  505. #if ST
  506.     IF WorkIn[0] = OffScreenWork THEN
  507.       WITH contrl.v DO
  508.         a[0]:= 100; (*VOpnBm() *)
  509.         a[1]:= 0;
  510.       (*a[2]:= 6;*)
  511.         a[3]:= 20;
  512.       (*a[4]:= 45;*)
  513.         a[5]:= 1; (*VOpnBm() *)
  514.       (*a[6]:= GrafHandle(D,D,D,D);*)
  515.         v1:= ADR(Buffer); (* a[7..8] *)
  516.       END;
  517.     END;
  518. #endif
  519.  
  520.     vdi;
  521.  
  522.     Handle:= contrl.c[6];
  523.  
  524. #if ST
  525.     IF WorkIn[0] # OffScreenWork THEN
  526. #endif
  527.       Buffer.FDAddr:= contrl.b; (* contrl.c[0..1] *)
  528. #if ST
  529.     ELSE
  530.       OffScreen:= Handle;
  531.     END;
  532. #endif
  533.  
  534. #if long
  535.    FOR i:= 0 TO 44 DO
  536.      WorkOut[i]:= intout[i];
  537.    END;
  538.  
  539.    FOR i:= 45 TO (MaxWorkOut - 1) DO
  540.      WorkOut[i]:= ptsout[i - 45];
  541.    END;
  542. #else
  543.     iioff:= ADR(intin);
  544.     iooff:= ADR(intout);
  545.     pooff:= ADR(ptsout);
  546.   END;
  547. #endif
  548. END VOpnWk;
  549.  
  550. PROCEDURE VClsWk(VAR Handle: UNSIGNEDWORD);
  551. BEGIN
  552. #if ST
  553.   IF Handle = OffScreen THEN
  554.     contrl.c[5]:= 1; (* VClsBm() *)
  555.     CallVDI(101,0,0,Handle);
  556.     OffScreen:= 0;
  557.   ELSE
  558. #endif
  559.     CallVDI(2,0,0,Handle);
  560. #if ST
  561.   END;
  562. #endif
  563.   Handle:= 0; (* to use as a flag *)
  564. END VClsWk;
  565.  
  566. PROCEDURE VOpnVWk(VAR WorkIn : ARRAY OF UNSIGNEDWORD;
  567.                   VAR Handle : UNSIGNEDWORD;
  568.                   VAR WorkOut: ARRAY OF UNSIGNEDWORD);
  569. #if long
  570. VAR i: [0..(MaxWorkIn - 1)];
  571. #endif
  572.  
  573. BEGIN
  574. #if long
  575.   FOR i:= 0 TO HIGH(WorkIn) DO
  576.     intin[i]:= WorkIn[i];
  577.   END;
  578. #else
  579.   WITH v DO
  580.     iioff:= ADR(WorkIn);
  581.     iooff:= ADR(WorkOut);
  582.     pooff:= ADR(WorkOut[45]);
  583. #endif
  584.     CallVDI(100,0,HIGH(WorkIn) + 1,Handle); (* input handle  *)
  585.  (* Handle:= contrl.c[6]; *)
  586.     IF contrl.c[6] = Handle THEN
  587.       Handle:= 0; (* error *)
  588.     ELSE
  589.       Handle:= contrl.c[6];
  590.     END;
  591. #if long
  592.   FOR i:= 0 TO 44 DO
  593.     WorkOut[i]:= intout[i];
  594.   END;
  595.   FOR i:= 45 TO (MaxWorkOut - 1) DO
  596.     WorkOut[i]:= ptsout[i - 45];
  597.   END;
  598. #else
  599.     iioff:= ADR(intin);
  600.     iooff:= ADR(intout);
  601.     pooff:= ADR(ptsout);
  602.   END;
  603. #endif
  604. END VOpnVWk;
  605.  
  606. PROCEDURE VClsVWk(VAR Handle: UNSIGNEDWORD);
  607. BEGIN
  608.   CallVDI(101,0,0,Handle);
  609.   Handle:= 0; (* to use as a flag *)
  610. END VClsVWk;
  611.  
  612. PROCEDURE VOpnBm(VAR WorkIn : ARRAY OF UNSIGNEDWORD;
  613.                  VAR Bitmap : MFDB;
  614.                  VAR Handle : UNSIGNEDWORD;
  615.                  VAR WorkOut: ARRAY OF UNSIGNEDWORD);
  616. #if long
  617. VAR i: [0..(MaxWorkIn - 1)];
  618. #endif
  619.  
  620. BEGIN
  621. #if long
  622.   FOR i:= 0 TO HIGH(WorkIn) DO
  623.     intin[i]:= WorkIn[i];
  624.   END;
  625. #else
  626.   WITH v DO
  627.     iioff:= ADR(WorkIn);
  628.     iooff:= ADR(WorkOut);
  629.     pooff:= ADR(WorkOut[45]);
  630. #endif
  631.     WITH contrl.v DO
  632.       a[0]:= 100; (*VOpnBm() *)
  633.       a[1]:= 0;
  634.     (*a[2]:= 6;*)
  635.       a[3]:= 20;
  636.     (*a[4]:= 45;*)
  637.       a[5]:= 1; (*VOpnBm() *)
  638.       v1:= ADR(Bitmap); (* a[7..8] *)
  639.     END;
  640.  
  641.     vdi;
  642.  
  643.     Handle:= contrl.c[6];
  644.  
  645. #if long
  646.   FOR i:= 0 TO 44 DO
  647.     WorkOut[i]:= intout[i];
  648.   END;
  649.   FOR i:= 45 TO (MaxWorkOut - 1) DO
  650.     WorkOut[i]:= ptsout[i - 45];
  651.   END;
  652. #else
  653.     iioff:= ADR(intin);
  654.     iooff:= ADR(intout);
  655.     pooff:= ADR(ptsout);
  656.   END;
  657. #endif
  658. END VOpnBm;
  659.  
  660. PROCEDURE VClsBm(VAR Handle: UNSIGNEDWORD);
  661. BEGIN
  662.   WITH contrl.v DO
  663.     a[0]:= 101; (*VClsBm() *)
  664.     a[1]:= 0;
  665.     a[3]:= 0;
  666.     a[5]:= 1; (*VClsBm() *)
  667.     a[6]:= Handle;
  668.   END;
  669.  
  670.   vdi;
  671.  
  672.   Handle:= 0; (* to use as a flag *)
  673. END VClsBm;
  674.  
  675. PROCEDURE VClrWk(Handle: UNSIGNEDWORD);
  676. BEGIN
  677.   CallVDI(3,0,0,Handle);
  678. END VClrWk;
  679.  
  680. PROCEDURE VUpdWk(    Handle: UNSIGNEDWORD;
  681.                  VAR Buffer: MFDB): UNSIGNEDWORD;
  682. BEGIN
  683.   contrl.c[4]:= 0; (* st magazin 7/1993 p. 89 *)
  684.   IF (Buffer.FDAddr # NIL) OR (Buffer.FDAddr # NULL) THEN
  685.     v.iioff:= Buffer.FDAddr;
  686.     CallVDI(4,1,2,Handle);
  687.   ELSE
  688.     CallVDI(4,0,0,Handle); (* clear buffer *)
  689.   END;
  690.   v.iioff:= ADR(intin);
  691.   RETURN intout[0];
  692. END VUpdWk;
  693.  
  694. PROCEDURE VSTLoadFonts(Handle: UNSIGNEDWORD;
  695.                        Select: UNSIGNEDWORD;
  696.                        Max   : UNSIGNEDWORD;
  697.                        Free  : UNSIGNEDWORD): UNSIGNEDWORD;
  698. BEGIN
  699. #if ST
  700.   IF NOTVQGDOS() THEN
  701.     intout[0]:= 0; (* error *)
  702.     RETURN 0;
  703.   END;
  704. #endif
  705.   intin[0]:= Select;
  706.  
  707.   (* compatibility to GEM/3 *)
  708.   intin[1]:= Max;
  709.   intin[2]:= Free;
  710.  
  711.   CallVDI(119,0,3,Handle);
  712.   RETURN intout[0];
  713. END VSTLoadFonts;
  714.  
  715. PROCEDURE VSTUnloadFonts(Handle: UNSIGNEDWORD;
  716.                          Select: UNSIGNEDWORD);
  717. BEGIN
  718.   intin[0]:= Select;
  719.   CallVDI(120,0,1,Handle);
  720. END VSTUnloadFonts;
  721.  
  722. PROCEDURE VSClip(    Handle: UNSIGNEDWORD;
  723.                      Clip  : BOOLEAN;
  724.                  VAR PXY   : ARRAY OF XY);
  725. #if long
  726. VAR i: [0..3];
  727. #endif
  728.  
  729. BEGIN
  730. #if long
  731.   FOR i:= 0 TO 3 DO
  732.     ptsin[i]:= PXY[i];
  733.   END;
  734. #else
  735.   v.pioff:= ADR(PXY);
  736. #endif
  737.   intin[0]:= ORD(Clip);
  738.   CallVDI(129,2,1,Handle);
  739. #if not long
  740.   v.pioff:= ADR(ptsin);
  741. #endif
  742. END VSClip;
  743.  
  744. PROCEDURE VSetAppBuff(Handle: UNSIGNEDWORD;
  745.                       Buf   : ANYPOINTER;
  746.                       Size  : UNSIGNEDWORD);
  747.  
  748. VAR P: POINTER TO ANYPOINTER;
  749.  
  750. BEGIN
  751.   P:= ADR(intin);
  752.   P^:=Buf;
  753.   intin[2]:= Size;
  754.   WITH contrl DO
  755.     c[0]:= CAST(UNSIGNEDWORD,-1);
  756.     c[1]:= 0;
  757.     c[3]:= 3;
  758.     c[5]:= 6;
  759.     c[6]:= Handle; (* for NVDI *)
  760.   END;
  761.   vdi;
  762. END VSetAppBuff;
  763.  
  764. PROCEDURE VBezCOn(Handle: UNSIGNEDWORD; OnOff: BOOLEAN): UNSIGNEDWORD;
  765. BEGIN
  766.   intin[0]:= ORD(OnOff);
  767.   contrl.c[5]:= 13;
  768.   CallVDI(11,ORD(OnOff),1,Handle);
  769.   RETURN intout[0];
  770. END VBezCOn;
  771.  
  772. PROCEDURE VBezOn(Handle: UNSIGNEDWORD): UNSIGNEDWORD;
  773.  
  774. CONST On = 1;
  775.  
  776. BEGIN
  777.   intin[0]:= On;
  778.   contrl.c[4]:= 4; (* ATARI docs say so *)
  779.   contrl.c[5]:= 13;
  780.   CallVDI(11,On,1,Handle); (* s. st computer 9/1993 p. 93 *)
  781.   RETURN intout[0];
  782. END VBezOn;
  783.  
  784. PROCEDURE VBezOff(Handle: UNSIGNEDWORD);
  785.  
  786. CONST Off = 0;
  787.  
  788. BEGIN
  789.   intin[0]:= Off;
  790.   contrl.c[4]:= 0;
  791.   contrl.c[5]:= 13;
  792.   CallVDI(11,Off,1,Handle); (* s. st computer 9/1993 p. 93 *)
  793. END VBezOff;
  794.  
  795. PROCEDURE VBezQual(Handle: UNSIGNEDWORD;
  796.                    PrCnt : UNSIGNEDWORD): UNSIGNEDWORD;
  797. BEGIN
  798.   intin[0]:= 32;
  799.   intin[1]:= 1;
  800.   intin[2]:= PrCnt;
  801.   contrl.c[4]:= 1;
  802.   CallVDIEsc(99,0,3,Handle);
  803.   RETURN intout[0];
  804. END VBezQual;
  805.  
  806. PROCEDURE VQBez(Handle: UNSIGNEDWORD):BOOLEAN;
  807.  
  808. VAR Qual: UNSIGNEDWORD;
  809.  
  810. BEGIN
  811.   Qual:= VBezQual(Handle,100);
  812.   intout[0]:= 0;
  813.   Qual:= VBezOn(Handle);
  814.   VBezOff(Handle);
  815.   RETURN Qual # 0;
  816. END VQBez;
  817.  
  818. PROCEDURE VPatRotate(Handle: UNSIGNEDWORD;
  819.                      Angle : UNSIGNEDWORD);
  820. BEGIN
  821.   intin[0]:= Angle;
  822.   CallVDI(134,0,1,Handle);
  823. END VPatRotate;
  824.  
  825. PROCEDURE VSaveCache(    Handle  : UNSIGNEDWORD;
  826.                      VAR FileName: ARRAY OF CHAR): SIGNEDWORD;
  827. #if ST
  828. VAR i: [0..MaxInput];
  829. #endif
  830. BEGIN
  831. #if ST
  832.   IF VQFSMGDOS() THEN
  833.     i:= 0;
  834.     WHILE FileName[i] # EOS DO
  835.       intin[i]:= ORD(FileName[i]);
  836.       INC(i);
  837.     END;
  838.     CallVDI(249,0,i,Handle);
  839.     RETURN intout[0];
  840.   END;
  841. #endif
  842.   RETURN 0;
  843. END VSaveCache;
  844.  
  845. PROCEDURE VLoadCache(    Handle  : UNSIGNEDWORD;
  846.                      VAR FileName: ARRAY OF CHAR;
  847.                          Replace : BOOLEAN): SIGNEDWORD;
  848. #if ST
  849. VAR i: [0..MaxInput];
  850. #endif
  851. BEGIN
  852. #if ST
  853.   IF VQFSMGDOS() THEN
  854.     intin[0]:= ORD(Replace);
  855.     i:= 0;
  856.     WHILE FileName[i] # EOS DO
  857.       intin[i + 1]:= ORD(FileName[i]);
  858.       INC(i);
  859.     END;
  860.     CallVDI(250,0,i + 1,Handle);
  861.     RETURN intout[0];
  862.   END;
  863. #endif
  864.   RETURN -1;
  865. END VLoadCache;
  866.  
  867. PROCEDURE VFlushCache(Handle: UNSIGNEDWORD): SIGNEDWORD;
  868. BEGIN
  869. #if ST
  870.   IF VQFSMGDOS() THEN
  871.     CallVDI(251,0,0,Handle);
  872.     RETURN intout[0];
  873.   END;
  874. #endif
  875.   RETURN -1;
  876. END VFlushCache;
  877.  
  878. PROCEDURE VGetOutline(    Handle  : UNSIGNEDWORD;
  879.                           Char    : CHAR;
  880.                       VAR XYArray : ARRAY OF XY;
  881.                       VAR BezArray: ARRAY OF ANYBYTE;
  882.                           MaxVerts: UNSIGNEDWORD;
  883.                       VAR NumVerts: UNSIGNEDWORD);
  884.  
  885. VAR P: POINTER TO ARRAY[0..1] OF ANYPOINTER;
  886.  
  887. BEGIN
  888.   intin[0]:= ORD(Char);
  889.   intin[1]:= MaxVerts;
  890.   P:= ADR(intin[2]);
  891.   P^[0]:= ADR(XYArray);
  892.   P^[1]:= ADR(BezArray);
  893.   contrl.c[2]:= 0;
  894.   contrl.c[4]:= 1;
  895.   CallVDI(243,0,6,Handle);
  896.   NumVerts:= intout[0];
  897. END VGetOutline;
  898.  
  899. PROCEDURE VSTScratch(Handle: UNSIGNEDWORD; Mode: UNSIGNEDWORD);
  900. BEGIN
  901.   intin[0]:= Mode;
  902.   CallVDI(244,0,1,Handle);
  903. END VSTScratch;
  904.  
  905. PROCEDURE VSTError(    Handle  : UNSIGNEDWORD;
  906.                        Mode    : BOOLEAN;
  907.                    VAR ErrorVar: SIGNEDWORD);
  908.  
  909. VAR P: POINTER TO SIGNEDWORD;
  910.  
  911. BEGIN
  912.   intin[0]:= ORD(Mode);
  913.   P:= ADR(intin[1]);
  914.   P^:= ErrorVar;
  915.   CallVDI(245,0,3,Handle);
  916. END VSTError;
  917.  
  918. PROCEDURE VSTCharMap(Handle: UNSIGNEDWORD; Mode: BOOLEAN);
  919. BEGIN
  920. #if ST
  921.   intin[0]:= ORD(Mode);
  922.   CallVDI(236,0,1,Handle);
  923. #endif
  924. END VSTCharMap;
  925.  
  926. PROCEDURE VQScrnInfo(    Handle : UNSIGNEDWORD;
  927.                      VAR WorkOut: ARRAY OF UNSIGNEDWORD);
  928.  
  929. #if ST
  930. CONST EdDI = 045644449H;
  931.  
  932. VAR Value: UNSIGNEDLONG;
  933. #endif
  934.  
  935. BEGIN
  936. #if ST
  937.   IF GetCookie(EdDI,Value) THEN
  938.     v.iooff:= ADR(WorkOut);
  939.     intin[0]:= 2; (* ? *)
  940.     contrl.c[5]:= 1;
  941.     CallVDI(102,0,1,Handle);
  942.     v.iooff:= ADR(intout);
  943.   ELSE
  944.     intout[0]:= 0; (* error *)
  945.   END;
  946. #else
  947.   intout[0]:= 0; (* error *)
  948. #endif
  949. END VQScrnInfo;
  950.  
  951. #if ST
  952. BEGIN
  953.   OffScreen:= 0;
  954. #endif
  955. END VControl.
  956.